{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "26503a8b-e235-47f7-a3ea-d0088ad19378"
    }
   },
   "source": [
    "### Chapter 12\n",
    "## Model Selection\n",
    "\n",
    "### 12.0 Introduction\n",
    "In machine learning, we use training algorithms to learn the parameters of a model by minimizing some loss function. However, in addition many learning algorithms (e.g., support vector classifier and random forests) also have hyperparameters that must be defined outside of the learning process. For example, random forests are collections of decision trees (hence the word forest); however, the number of decision trees in the forest is not learned by the algorithm and must be set prior to fitting. This is often referred to as hyperparameter tuning, hyperparameter optimization, or model selection. Additionally, often we might want to try multiple learning algorithms (for example, trying both support vector classifier and random forests to see which learning method produces the best model).\n",
    "\n",
    "While there is widespread variation in the use of terminology in this area, in this book we refer to both selecting the best learning algorithm and its best hyperparameters as model selection. The reason is straightforward: imagine we have data and want to train a support vector classifier with 10 candidate hyperparameter values and a random forest classifier with 10 candidate hyperparameter values. The result is that we are trying to select the best model from a set of 20 candidate models. In this chapter, we will cover techniques to efficiently select the best model from the set of candidates.\n",
    "\n",
    "Throughout this chapter we will refer to specific hyperparameters, such as C (the inverse of regulatizaiton strength). Do not worry if you don't know what the hyperparameters are. We will cover them in later chapters. Instead, just treat hyperparameters like the settings for the learning algorithm we must choose before starting training\n",
    "\n",
    "### 12.1 Selecting Best Models Using Exhaustive Search\n",
    "#### Problem\n",
    "You want to select the best model by searching over a range of hyperparameters.\n",
    "\n",
    "#### Solution\n",
    "Use scikit-learn's GridSearchCV:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "nbpresent": {
     "id": "8073c049-9b62-4696-bacf-870d50a7f8e6"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 20 candidates, totalling 100 fits\n",
      "Best penalty: l1\n",
      "Best C: 7.742636826811269\n",
      "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1\n",
      " 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2\n",
      " 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2\n",
      " 2 2]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done 100 out of 100 | elapsed:    0.8s finished\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn import linear_model, datasets\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "# load data\n",
    "iris = datasets.load_iris()\n",
    "features = iris.data\n",
    "target = iris.target\n",
    "\n",
    "# create logistic regression\n",
    "logistic = linear_model.LogisticRegression()\n",
    "\n",
    "# create range of candidate penalty hyper parameter values\n",
    "penalty = ['l1', 'l2']\n",
    "\n",
    "# create range of candidate regularizaiton hyperparameter values\n",
    "C = np.logspace(0, 4, 10)\n",
    "\n",
    "# create dictinoary hyperparameter candidates\n",
    "hyperparameters = dict(C=C, penalty=penalty)\n",
    "\n",
    "# create grid search\n",
    "gridsearch = GridSearchCV(logistic, hyperparameters, cv=5, verbose=1)\n",
    "\n",
    "# fit grid search\n",
    "best_model = gridsearch.fit(features, target)\n",
    "\n",
    "# view best hyperparameters\n",
    "print(\"Best penalty: {}\".format(best_model.best_estimator_.get_params()['penalty']))\n",
    "print(\"Best C: {}\".format(best_model.best_estimator_.get_params()['C']))\n",
    "print(best_model.predict(features))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "033d3e20-7f33-40bb-989b-5afc440d8595"
    }
   },
   "source": [
    "#### Discussion\n",
    "`GridSearchCV` is a brute-force approach to model selection using cross-validation.\n",
    "\n",
    "#### See Also\n",
    "* http://scikit-learn.org/stable/modules/grid_search.html\n",
    "* http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV\n",
    "\n",
    "### 12.2 Selecting Best Models Using Randomized Search\n",
    "computational cheaper method than exhaustive search"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "nbpresent": {
     "id": "39f40450-02e8-4f78-b123-63a616ddf33e"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 100 candidates, totalling 500 fits\n",
      "Best penalty: l1\n",
      "Best C: 1.668088018810296\n",
      "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1\n",
      " 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2\n",
      " 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2\n",
      " 2 2]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Done 500 out of 500 | elapsed:    1.7s finished\n"
     ]
    }
   ],
   "source": [
    "from scipy.stats import uniform\n",
    "from sklearn import linear_model, datasets\n",
    "from sklearn.model_selection import RandomizedSearchCV\n",
    "\n",
    "# load data\n",
    "iris = datasets.load_iris()\n",
    "features = iris.data\n",
    "target = iris.target\n",
    "\n",
    "# create logistic regression\n",
    "logistic = linear_model.LogisticRegression()\n",
    "\n",
    "# create range of candidate penalty hyper parameter values\n",
    "penalty = ['l1', 'l2']\n",
    "\n",
    "# create range of candidate regularizaiton hyperparameter values\n",
    "C = uniform(loc=0, scale=4)\n",
    "\n",
    "# create dictinoary hyperparameter candidates\n",
    "hyperparameters = dict(C=C, penalty=penalty)\n",
    "\n",
    "# create grid search\n",
    "randomizedsearch = RandomizedSearchCV(logistic, hyperparameters, random_state=1, n_iter=100, cv=5, verbose=1, n_jobs=-1)\n",
    "\n",
    "# fit grid search\n",
    "best_model = randomizedsearch.fit(features, target)\n",
    "\n",
    "# view best hyperparameters\n",
    "print(\"Best penalty: {}\".format(best_model.best_estimator_.get_params()['penalty']))\n",
    "print(\"Best C: {}\".format(best_model.best_estimator_.get_params()['C']))\n",
    "print(best_model.predict(features))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "c18acd39-68cd-4bb9-9a0e-0d7c743ec0aa"
    }
   },
   "source": [
    "* RandomizedSearchCV (http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html)\n",
    "* Random Searh for Hyper-Parameter Optimization (http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf)\n",
    "\n",
    "### 12.3 Selecting Best Models from Multiple Learning Algorithms"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "nbpresent": {
     "id": "cf395a94-1178-4443-a96b-0aa8f7832039"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 29 candidates, totalling 145 fits\n",
      "LogisticRegression(C=7.742636826811269, class_weight=None, dual=False,\n",
      "          fit_intercept=True, intercept_scaling=1, max_iter=100,\n",
      "          multi_class='ovr', n_jobs=1, penalty='l1', random_state=None,\n",
      "          solver='liblinear', tol=0.0001, verbose=0, warm_start=False)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done 145 out of 145 | elapsed:   21.3s finished\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn import datasets\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "# set random seed\n",
    "np.random.seed(0)\n",
    "\n",
    "# load data\n",
    "iris = datasets.load_iris()\n",
    "features = iris.data\n",
    "target = iris.target\n",
    "\n",
    "# create a pipeline\n",
    "pipe = Pipeline([(\"classifier\", RandomForestClassifier())])\n",
    "\n",
    "# create dictionary with candidate learning algorithms and their hyperparameters\n",
    "search_space = [{\n",
    "                    'classifier': [LogisticRegression()],\n",
    "                    'classifier__penalty': ['l1', 'l2'],\n",
    "                    'classifier__C': np.logspace(0, 4, 10)},\n",
    "                {\n",
    "                    'classifier': [RandomForestClassifier()],\n",
    "                    'classifier__n_estimators': [10, 100, 1000],\n",
    "                    'classifier__max_features': [1, 2, 3]\n",
    "                }]\n",
    "\n",
    "# create grid search\n",
    "gridsearch = GridSearchCV(pipe, search_space, cv=5, verbose=1)\n",
    "\n",
    "# fit grid search\n",
    "best_model = gridsearch.fit(features, target)\n",
    "\n",
    "# view best model\n",
    "print(best_model.best_estimator_.get_params()['classifier'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "ec1b11e9-131b-4f4c-be43-bf0ec6c090d9"
    }
   },
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "nbpresent": {
     "id": "1335ab52-0eb1-4b14-a7e1-616146984f2f"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "       2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "best_model.predict(features)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "dfe4d52a-fbf8-4870-9cf5-eebf59e170ca"
    }
   },
   "source": [
    "### 12.4 Selecting Best Models When Preprocessing\n",
    "#### Problem\n",
    "You want to include a preprocessing step during model selection\n",
    "\n",
    "#### Solution\n",
    "Create a pipeline that includes the preprocessing step and any of its parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "nbpresent": {
     "id": "e1ff355b-7ac9-493e-9628-f999d0112147"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn import datasets\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.pipeline import Pipeline, FeatureUnion\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# set random seed\n",
    "np.random.seed(0)\n",
    "\n",
    "# load data\n",
    "iris = datasets.load_iris()\n",
    "features = iris.data\n",
    "target = iris.target\n",
    "\n",
    "# create a preprocessing obejct taht includes StandardScaler features and PCA\n",
    "preprocess = FeatureUnion([(\"std\", StandardScaler()), (\"pca\", PCA())])\n",
    "\n",
    "# create a pipeline\n",
    "pipe = Pipeline([(\"preprocess\", preprocess),\n",
    "                 (\"classifier\", LogisticRegression())\n",
    "                ])\n",
    "\n",
    "# create a space of candidate values\n",
    "search_space = [{\n",
    "    \"preprocess__pca__n_components\": [1, 2, 3],\n",
    "    \"classifier__penalty\": [\"l1\", \"l2\"],\n",
    "    \"classifier__C\": np.logspace(0, 4, 10)\n",
    "}]\n",
    "\n",
    "# create grid search\n",
    "clf = GridSearchCV(pipe, search_space, cv=5, verbose=0, n_jobs=-1)\n",
    "\n",
    "# fit grid search\n",
    "best_model = clf.fit(features, target)\n",
    "\n",
    "# view best model\n",
    "best_model.best_estimator_.get_params()['preprocess__pca__n_components']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "4538f2c9-2757-49b2-b9c1-e8fe3724e573"
    }
   },
   "source": [
    "### 12.7 Evaluating Performance After Model Selection\n",
    "#### Problem\n",
    "You want to evaluate the performance of a model found through model selection.\n",
    "\n",
    "#### Solution\n",
    "Use nested cross-validation to avoid biased evaluation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "nbpresent": {
     "id": "2efb77c4-9744-4a10-acb6-c48509eeb0fa"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9534313725490197"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn import linear_model, datasets\n",
    "from sklearn.model_selection import GridSearchCV, cross_val_score\n",
    "\n",
    "# load data\n",
    "iris = datasets.load_iris()\n",
    "features = iris.data\n",
    "target = iris.target\n",
    "\n",
    "# create logistic regression\n",
    "logistic = LogisticRegression()\n",
    "\n",
    "# create range of 20 candidate values for C\n",
    "C = np.logspace(0, 4, 20)\n",
    "\n",
    "# create hyperparameter options\n",
    "hyperparameters = dict(C=C)\n",
    "\n",
    "# create grid search\n",
    "gridsearch = GridSearchCV(logistic, hyperparameters, cv=5, n_jobs=-1, verbose=0)\n",
    "\n",
    "# conduct nested cross-validation and output the average score\n",
    "cross_val_score(gridsearch, features, target).mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "7eab6e3b-325d-4467-a087-946cd36fda56"
    }
   },
   "source": [
    "#### Discussion\n",
    "Nested cross-validation during model selection is a difficult concept for many people to grasp the first time. Remember that in k-fold cross-validation, we train our model on k-1 folds of the data, use this model to make predictions on the remaining fold, and then evaluate our model best on how well our model's predictions compare to the true values. We then repeat this process k times.\n",
    "\n",
    "In the model selection searches described in this chapter (i.e. `GridSearchCV` and `RandomizedSearchCV`), we used cross-validation to evaluate which hyperparameter values produced the best models. However, a nuanced and generally underappreciated problem arises: since we used the data to select the best hyperparameter values, we cannot use that same data to evaluate the model's performance. The solution? Wrap the cross-validation used for model search in another cross-validation! In nested cross-validation, the \"inner\" cross-validation selects the best model, while the \"outer\" cross-validation provides us with an unbiased evaluation of the model's performance. In our solution, the inner cross-validation is our `GridSearchCV` object, which we then wrap in an outer cross-validation using `cross_val_score`.\n",
    "\n",
    "If you are confused, try a simple experiment. First set `verbose=1` so we can see what is happening:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "nbpresent": {
     "id": "61374f8a-04ae-4c73-a232-12d1957e2ca5"
    }
   },
   "outputs": [],
   "source": [
    "gridsearch = GridSearchCV(logistic, hyperparameters, cv=5, verbose=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, run `gridsearch.fit(features, target)`, which is our inner cross-validation used to find the best_model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 20 candidates, totalling 100 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done 100 out of 100 | elapsed:    0.2s finished\n"
     ]
    }
   ],
   "source": [
    "best_model = gridsearch.fit(features, target)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "From the output you can see the inner cross-validation trained 20 candidate models five times, totaling 100 models. Next, nest clf inside a new cross-validation, which defaults to three folds:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 20 candidates, totalling 100 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done 100 out of 100 | elapsed:    0.2s finished\n",
      "[Parallel(n_jobs=1)]: Done 100 out of 100 | elapsed:    0.2s finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 20 candidates, totalling 100 fits\n",
      "Fitting 5 folds for each of 20 candidates, totalling 100 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done 100 out of 100 | elapsed:    0.2s finished\n"
     ]
    }
   ],
   "source": [
    "scores = cross_val_score(gridsearch, features, target)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The output shows that the inner cross-validation trained 20 models five times to find the best model, and this model was evaluated using an outer three-fold cross-validation, creating a total of 300 models trained"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:machine_learning_cookbook]",
   "language": "python",
   "name": "conda-env-machine_learning_cookbook-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  },
  "nbpresent": {
   "slides": {
    "0090975e-3c6e-48c0-8351-1340c5f655e0": {
     "id": "0090975e-3c6e-48c0-8351-1340c5f655e0",
     "prev": "08d7a56f-a475-4da2-9bd6-fadfd6b94b90",
     "regions": {
      "6af4b81e-0495-49c6-b2d3-4b91ecf9ea02": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "7eab6e3b-325d-4467-a087-946cd36fda56",
        "part": "whole"
       },
       "id": "6af4b81e-0495-49c6-b2d3-4b91ecf9ea02"
      }
     }
    },
    "0325ec25-7c9f-4a7c-b7ee-f4613941a51e": {
     "id": "0325ec25-7c9f-4a7c-b7ee-f4613941a51e",
     "prev": "6eed1e4f-fce8-4efb-ae77-4c6c28dd51ba",
     "regions": {
      "c8d879b6-7dc5-4eb4-be22-742bf33092ce": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "7eab6e3b-325d-4467-a087-946cd36fda56",
        "part": "whole"
       },
       "id": "c8d879b6-7dc5-4eb4-be22-742bf33092ce"
      }
     }
    },
    "03eb39f7-c8ce-4179-8c61-b4b4970e8333": {
     "id": "03eb39f7-c8ce-4179-8c61-b4b4970e8333",
     "prev": "f403c5f2-268c-41fb-8ad6-380e8902fa8f",
     "regions": {
      "6ca6041b-07ba-4b34-a987-2ada8a9ff4d9": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "c72177e5-a234-498e-8c62-d0eb4b75cd0b",
        "part": "whole"
       },
       "id": "6ca6041b-07ba-4b34-a987-2ada8a9ff4d9"
      }
     }
    },
    "083acf1f-a943-438e-a9af-bf0dff4064cf": {
     "id": "083acf1f-a943-438e-a9af-bf0dff4064cf",
     "prev": "0caec2e7-f4dd-417b-8400-18cba9c7c7e8",
     "regions": {
      "f773a8e1-9a8c-4f1b-8680-3276dcecb306": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "c18acd39-68cd-4bb9-9a0e-0d7c743ec0aa",
        "part": "whole"
       },
       "id": "f773a8e1-9a8c-4f1b-8680-3276dcecb306"
      }
     }
    },
    "08d7a56f-a475-4da2-9bd6-fadfd6b94b90": {
     "id": "08d7a56f-a475-4da2-9bd6-fadfd6b94b90",
     "prev": "dac65a00-6fb2-4683-b280-7f6bbb94a480",
     "regions": {
      "9d4e95db-bbbf-4147-b41b-81cd8c65fd5b": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "2efb77c4-9744-4a10-acb6-c48509eeb0fa",
        "part": "whole"
       },
       "id": "9d4e95db-bbbf-4147-b41b-81cd8c65fd5b"
      }
     }
    },
    "0bcadabd-4704-4807-90ce-de5aa098adc5": {
     "id": "0bcadabd-4704-4807-90ce-de5aa098adc5",
     "prev": "78af927b-83dc-462f-aad3-9a11ed9732d8",
     "regions": {
      "d4eb9b46-f81f-4cd6-a196-0345e39eff76": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "ab8d15bc-0308-4b87-9b99-bf3c96a2f85d",
        "part": "whole"
       },
       "id": "d4eb9b46-f81f-4cd6-a196-0345e39eff76"
      }
     }
    },
    "0caec2e7-f4dd-417b-8400-18cba9c7c7e8": {
     "id": "0caec2e7-f4dd-417b-8400-18cba9c7c7e8",
     "prev": "a8562798-a1ff-402f-b5d8-c204f4983c7d",
     "regions": {
      "906e3886-0d33-47e6-9872-8b72b5b1d058": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "39f40450-02e8-4f78-b123-63a616ddf33e",
        "part": "whole"
       },
       "id": "906e3886-0d33-47e6-9872-8b72b5b1d058"
      }
     }
    },
    "0f8b6b84-a4ac-4e46-9665-c6dce0260005": {
     "id": "0f8b6b84-a4ac-4e46-9665-c6dce0260005",
     "prev": "f4916937-b47a-4a59-8349-d877f3a588f4",
     "regions": {
      "cfb3468a-bc6d-4f67-91ba-6e32780098bf": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "89c13a3e-6895-430a-83fa-76febf09c94d",
        "part": "whole"
       },
       "id": "cfb3468a-bc6d-4f67-91ba-6e32780098bf"
      }
     }
    },
    "18eb1f6d-15f2-44ac-b4ee-7fe2906a4749": {
     "id": "18eb1f6d-15f2-44ac-b4ee-7fe2906a4749",
     "prev": "e719aa7e-70d7-4867-9b8f-2245670c97ae",
     "regions": {
      "0f4183bd-2124-4fbd-a384-f9a9c7b5f872": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "c22600f5-c6b2-4cc5-8ef4-1573a303f240",
        "part": "whole"
       },
       "id": "0f4183bd-2124-4fbd-a384-f9a9c7b5f872"
      }
     }
    },
    "1f30fe39-ff77-40b2-b766-0ec867f565bd": {
     "id": "1f30fe39-ff77-40b2-b766-0ec867f565bd",
     "prev": "bbed4d55-267f-4d69-9130-e60d6b07a7fc",
     "regions": {
      "24eb7a53-45ce-4891-9d62-7c26f3717caa": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "3e755559-80da-4cc3-855c-d4605804548c",
        "part": "whole"
       },
       "id": "24eb7a53-45ce-4891-9d62-7c26f3717caa"
      }
     }
    },
    "23f4ac33-b77d-41f8-8cae-6087eb52b5f0": {
     "id": "23f4ac33-b77d-41f8-8cae-6087eb52b5f0",
     "prev": "d4a1f08f-d5b3-4e23-b406-b97d0b73acf8",
     "regions": {
      "aee753b8-e28f-42d3-b9c0-137c803cbeb9": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "34b457be-6b84-401d-9262-3907f5a74648",
        "part": "whole"
       },
       "id": "aee753b8-e28f-42d3-b9c0-137c803cbeb9"
      }
     }
    },
    "278d1841-c74d-4cc0-a92b-eba4e66b71aa": {
     "id": "278d1841-c74d-4cc0-a92b-eba4e66b71aa",
     "prev": "96b6894f-2552-4822-b04d-58171ad8f238",
     "regions": {
      "a30eeb84-0426-4964-b878-812e1a7dfa61": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "b9a7934c-ba10-4f66-88d6-f2a0ba9d65c5",
        "part": "whole"
       },
       "id": "a30eeb84-0426-4964-b878-812e1a7dfa61"
      }
     }
    },
    "28ebd4df-42c0-448f-b0ea-290a419e5c8e": {
     "id": "28ebd4df-42c0-448f-b0ea-290a419e5c8e",
     "prev": "85366fc7-ce11-4a5b-8c4d-901fd4af2e92",
     "regions": {
      "c44219d8-2e7b-4297-b750-25f2923d3aaa": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "14c18d7e-29d9-4c25-95c5-cfb5aec7f1c4",
        "part": "whole"
       },
       "id": "c44219d8-2e7b-4297-b750-25f2923d3aaa"
      }
     }
    },
    "309f9412-d756-49b5-826b-d61d5bed4765": {
     "id": "309f9412-d756-49b5-826b-d61d5bed4765",
     "prev": "a76ebb40-0838-4848-b2d6-f175b1eadfdb",
     "regions": {
      "838cec87-3095-4449-8eb1-18811a3fb9e5": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "4538f2c9-2757-49b2-b9c1-e8fe3724e573",
        "part": "whole"
       },
       "id": "838cec87-3095-4449-8eb1-18811a3fb9e5"
      }
     }
    },
    "31d6a5a2-39b5-44c2-91c7-8157d50c8826": {
     "id": "31d6a5a2-39b5-44c2-91c7-8157d50c8826",
     "prev": "23f4ac33-b77d-41f8-8cae-6087eb52b5f0",
     "regions": {
      "54ed4a5e-cc37-486f-aca3-8202e4597184": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "def8f1e0-7577-48b5-8af7-84bed23ec571",
        "part": "whole"
       },
       "id": "54ed4a5e-cc37-486f-aca3-8202e4597184"
      }
     }
    },
    "337f8b23-10d1-412f-8664-af7c12f900a8": {
     "id": "337f8b23-10d1-412f-8664-af7c12f900a8",
     "prev": "9d9cd307-9ba1-463a-9183-71e157131b08",
     "regions": {
      "b8201d8f-7188-4595-9dd8-2470b25f5639": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "60de0c0c-a4b8-47db-96ba-0edd0c28d959",
        "part": "whole"
       },
       "id": "b8201d8f-7188-4595-9dd8-2470b25f5639"
      }
     }
    },
    "5063271b-d616-43f0-aecd-484f101a99d0": {
     "id": "5063271b-d616-43f0-aecd-484f101a99d0",
     "prev": "aee9e0ac-5fc1-4ee8-ad93-094594c14c74",
     "regions": {
      "68e89492-5308-4479-be18-d5de8ff441dd": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "cbc82356-71f4-4ae6-9b65-ea4dfb110d69",
        "part": "whole"
       },
       "id": "68e89492-5308-4479-be18-d5de8ff441dd"
      }
     }
    },
    "531b7af8-91cf-4ec2-bab9-475c3e122897": {
     "id": "531b7af8-91cf-4ec2-bab9-475c3e122897",
     "prev": "03eb39f7-c8ce-4179-8c61-b4b4970e8333",
     "regions": {
      "6b794d26-3b70-4104-857e-3bb2190196a0": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "4f476af6-297f-4949-b83e-18aace59434b",
        "part": "whole"
       },
       "id": "6b794d26-3b70-4104-857e-3bb2190196a0"
      }
     }
    },
    "59999c89-a233-49ad-85ad-c5b334a829fb": {
     "id": "59999c89-a233-49ad-85ad-c5b334a829fb",
     "prev": "0f8b6b84-a4ac-4e46-9665-c6dce0260005",
     "regions": {
      "f9664939-cbcc-40d6-b277-29a4fe6b8fd9": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "ca8fed62-3924-4917-af8e-08ebdcfc8cb2",
        "part": "whole"
       },
       "id": "f9664939-cbcc-40d6-b277-29a4fe6b8fd9"
      }
     }
    },
    "5a3c8615-e864-48b8-8c49-60b47c6eb8a5": {
     "id": "5a3c8615-e864-48b8-8c49-60b47c6eb8a5",
     "prev": "59999c89-a233-49ad-85ad-c5b334a829fb",
     "regions": {
      "874dcb74-0e13-4157-af1a-13d34a2888f0": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "4f2fa0f6-91f5-4473-82d2-9a85bffcd840",
        "part": "whole"
       },
       "id": "874dcb74-0e13-4157-af1a-13d34a2888f0"
      }
     }
    },
    "661eb3af-fc8c-4e3f-96b0-fd5c9faf6949": {
     "id": "661eb3af-fc8c-4e3f-96b0-fd5c9faf6949",
     "prev": "0bcadabd-4704-4807-90ce-de5aa098adc5",
     "regions": {
      "24bc3ffa-20a9-4a5c-a276-a072d1d09402": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "99539aea-1daa-4bac-a393-99ab1df62b0e",
        "part": "whole"
       },
       "id": "24bc3ffa-20a9-4a5c-a276-a072d1d09402"
      }
     }
    },
    "6ebaa57e-2c71-4755-9a95-16aa22d4c833": {
     "id": "6ebaa57e-2c71-4755-9a95-16aa22d4c833",
     "prev": null,
     "regions": {
      "e20d982a-5d63-4f4f-9625-b41ae10f86e8": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "26503a8b-e235-47f7-a3ea-d0088ad19378",
        "part": "whole"
       },
       "id": "e20d982a-5d63-4f4f-9625-b41ae10f86e8"
      }
     }
    },
    "6eed1e4f-fce8-4efb-ae77-4c6c28dd51ba": {
     "id": "6eed1e4f-fce8-4efb-ae77-4c6c28dd51ba",
     "prev": "309f9412-d756-49b5-826b-d61d5bed4765",
     "regions": {
      "1c0bd82f-61dd-4674-a6ea-0a482254ebd8": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "2efb77c4-9744-4a10-acb6-c48509eeb0fa",
        "part": "whole"
       },
       "id": "1c0bd82f-61dd-4674-a6ea-0a482254ebd8"
      }
     }
    },
    "70af8e65-c113-4b50-a1a5-dce71786e991": {
     "id": "70af8e65-c113-4b50-a1a5-dce71786e991",
     "prev": "d0375cc9-5edd-4c8e-81e9-c767142a63fb",
     "regions": {
      "c7c51330-9f32-4480-837d-7939ef7d5cdb": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "cbc82356-71f4-4ae6-9b65-ea4dfb110d69",
        "part": "whole"
       },
       "id": "c7c51330-9f32-4480-837d-7939ef7d5cdb"
      }
     }
    },
    "78af927b-83dc-462f-aad3-9a11ed9732d8": {
     "id": "78af927b-83dc-462f-aad3-9a11ed9732d8",
     "prev": "ad13e648-5c6d-4ad9-a7a8-d8a4498765c6",
     "regions": {
      "f1b5a252-8518-4c86-a20c-3939ed46dff7": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "82ec062e-425e-42a0-9a18-c31c9592e4a2",
        "part": "whole"
       },
       "id": "f1b5a252-8518-4c86-a20c-3939ed46dff7"
      }
     }
    },
    "78b77ee9-8fa2-417c-8d90-28d9c6917ef6": {
     "id": "78b77ee9-8fa2-417c-8d90-28d9c6917ef6",
     "prev": "a7352d15-1a5a-4652-812b-8a6f5150018e",
     "regions": {
      "f6cf6ece-0aad-419a-bc7b-4937985f20e1": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "1335ab52-0eb1-4b14-a7e1-616146984f2f",
        "part": "whole"
       },
       "id": "f6cf6ece-0aad-419a-bc7b-4937985f20e1"
      }
     }
    },
    "85366fc7-ce11-4a5b-8c4d-901fd4af2e92": {
     "id": "85366fc7-ce11-4a5b-8c4d-901fd4af2e92",
     "prev": "337f8b23-10d1-412f-8664-af7c12f900a8",
     "regions": {
      "9d50efcd-5eed-4291-af02-65c3522818f8": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "a00b662c-7d35-43ab-97b0-560d55905cda",
        "part": "whole"
       },
       "id": "9d50efcd-5eed-4291-af02-65c3522818f8"
      }
     }
    },
    "90a26906-ca22-44f1-9aae-52dd23f34ec3": {
     "id": "90a26906-ca22-44f1-9aae-52dd23f34ec3",
     "prev": "0325ec25-7c9f-4a7c-b7ee-f4613941a51e",
     "regions": {
      "f945f2cb-948a-4002-995e-b4319aacc5f7": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "61374f8a-04ae-4c73-a232-12d1957e2ca5",
        "part": "whole"
       },
       "id": "f945f2cb-948a-4002-995e-b4319aacc5f7"
      }
     }
    },
    "96b6894f-2552-4822-b04d-58171ad8f238": {
     "id": "96b6894f-2552-4822-b04d-58171ad8f238",
     "prev": "cf6daabb-b28a-4659-9154-aaa46802e75a",
     "regions": {
      "8fc1ae5c-bbd8-4a20-8e9c-dda02cda42dc": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "4f476af6-297f-4949-b83e-18aace59434b",
        "part": "whole"
       },
       "id": "8fc1ae5c-bbd8-4a20-8e9c-dda02cda42dc"
      }
     }
    },
    "9d9cd307-9ba1-463a-9183-71e157131b08": {
     "id": "9d9cd307-9ba1-463a-9183-71e157131b08",
     "prev": "18eb1f6d-15f2-44ac-b4ee-7fe2906a4749",
     "regions": {
      "bf50e96f-6ac8-4398-adf8-b3eceaebd7dd": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "65453300-a508-45df-bbbc-1aacd7f85d31",
        "part": "whole"
       },
       "id": "bf50e96f-6ac8-4398-adf8-b3eceaebd7dd"
      }
     }
    },
    "a7352d15-1a5a-4652-812b-8a6f5150018e": {
     "id": "a7352d15-1a5a-4652-812b-8a6f5150018e",
     "prev": "e16d2151-e325-41ef-89e2-7e78b7fb0c16",
     "regions": {
      "930b0765-45ad-4c1f-9b53-c3e6c1c45754": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "ec1b11e9-131b-4f4c-be43-bf0ec6c090d9",
        "part": "whole"
       },
       "id": "930b0765-45ad-4c1f-9b53-c3e6c1c45754"
      }
     }
    },
    "a76ebb40-0838-4848-b2d6-f175b1eadfdb": {
     "id": "a76ebb40-0838-4848-b2d6-f175b1eadfdb",
     "prev": "deae24e7-3e39-4e1d-b2f4-f543cf4915e3",
     "regions": {
      "15362d76-89e8-47a9-a224-9ee65d4ed893": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "def8f1e0-7577-48b5-8af7-84bed23ec571",
        "part": "whole"
       },
       "id": "15362d76-89e8-47a9-a224-9ee65d4ed893"
      }
     }
    },
    "a8562798-a1ff-402f-b5d8-c204f4983c7d": {
     "id": "a8562798-a1ff-402f-b5d8-c204f4983c7d",
     "prev": "d16db595-9f13-49b8-8c70-a8e115227621",
     "regions": {
      "6e497e86-4f01-41be-91f2-d2c1609d995e": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "033d3e20-7f33-40bb-989b-5afc440d8595",
        "part": "whole"
       },
       "id": "6e497e86-4f01-41be-91f2-d2c1609d995e"
      }
     }
    },
    "ad13e648-5c6d-4ad9-a7a8-d8a4498765c6": {
     "id": "ad13e648-5c6d-4ad9-a7a8-d8a4498765c6",
     "prev": "78b77ee9-8fa2-417c-8d90-28d9c6917ef6",
     "regions": {
      "86346633-1c5d-4c33-bb37-a465d9bb840f": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "ea4f7f78-3cdb-479a-a9c4-27a9e6501c70",
        "part": "whole"
       },
       "id": "86346633-1c5d-4c33-bb37-a465d9bb840f"
      }
     }
    },
    "aee9e0ac-5fc1-4ee8-ad93-094594c14c74": {
     "id": "aee9e0ac-5fc1-4ee8-ad93-094594c14c74",
     "prev": "bb7ab273-0210-473f-b993-24d588eb3fdd",
     "regions": {
      "f3667b4b-e303-4347-a7ed-a4114b915ebc": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "c6770697-5b81-4a5f-b5bc-cfe6d96ecdc6",
        "part": "whole"
       },
       "id": "f3667b4b-e303-4347-a7ed-a4114b915ebc"
      }
     }
    },
    "bb7ab273-0210-473f-b993-24d588eb3fdd": {
     "id": "bb7ab273-0210-473f-b993-24d588eb3fdd",
     "prev": "f499aa32-135c-48d0-8c46-3a2464a4f175",
     "regions": {
      "6517347c-d605-4aac-985f-6161f044f0f8": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "e1ff355b-7ac9-493e-9628-f999d0112147",
        "part": "whole"
       },
       "id": "6517347c-d605-4aac-985f-6161f044f0f8"
      }
     }
    },
    "bbed4d55-267f-4d69-9130-e60d6b07a7fc": {
     "id": "bbed4d55-267f-4d69-9130-e60d6b07a7fc",
     "prev": "28ebd4df-42c0-448f-b0ea-290a419e5c8e",
     "regions": {
      "972dc39d-f58c-497d-bd70-612475cf0dfa": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "ca7dbb6a-6115-42c2-8fdb-f6d495babfe3",
        "part": "whole"
       },
       "id": "972dc39d-f58c-497d-bd70-612475cf0dfa"
      }
     }
    },
    "c3671b07-84a8-414f-9e57-a06be2eb044f": {
     "id": "c3671b07-84a8-414f-9e57-a06be2eb044f",
     "prev": "1f30fe39-ff77-40b2-b766-0ec867f565bd",
     "regions": {
      "8fdabd99-ee05-4f1c-bbb6-a35a41bf4219": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "df3d0a06-9785-42cb-a93d-fce5b1c204d0",
        "part": "whole"
       },
       "id": "8fdabd99-ee05-4f1c-bbb6-a35a41bf4219"
      }
     }
    },
    "cf6daabb-b28a-4659-9154-aaa46802e75a": {
     "id": "cf6daabb-b28a-4659-9154-aaa46802e75a",
     "prev": "d7dc555e-99e9-4811-9f57-010668a41080",
     "regions": {
      "ffe28c62-87e4-4d4c-9999-9a6cd600c8ed": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "c72177e5-a234-498e-8c62-d0eb4b75cd0b",
        "part": "whole"
       },
       "id": "ffe28c62-87e4-4d4c-9999-9a6cd600c8ed"
      }
     }
    },
    "d0375cc9-5edd-4c8e-81e9-c767142a63fb": {
     "id": "d0375cc9-5edd-4c8e-81e9-c767142a63fb",
     "prev": "fffffcc6-6c80-4cc2-b67e-5288640703d6",
     "regions": {
      "a37e9aec-4a9f-4a43-ab58-e3b102813f01": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "c6770697-5b81-4a5f-b5bc-cfe6d96ecdc6",
        "part": "whole"
       },
       "id": "a37e9aec-4a9f-4a43-ab58-e3b102813f01"
      }
     }
    },
    "d16db595-9f13-49b8-8c70-a8e115227621": {
     "id": "d16db595-9f13-49b8-8c70-a8e115227621",
     "prev": "6ebaa57e-2c71-4755-9a95-16aa22d4c833",
     "regions": {
      "a71dcc80-a374-4ec6-b2cf-064b62a42a31": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "8073c049-9b62-4696-bacf-870d50a7f8e6",
        "part": "whole"
       },
       "id": "a71dcc80-a374-4ec6-b2cf-064b62a42a31"
      }
     }
    },
    "d336642b-b226-42ad-8a4a-ba46ddb6e4e3": {
     "id": "d336642b-b226-42ad-8a4a-ba46ddb6e4e3",
     "prev": "d34e2833-285f-48fa-a922-6c28d6ceb739",
     "regions": {
      "ba30b6f5-86dc-4cc4-829a-a17fcb3d174b": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "59c84c0a-4f74-41cd-be98-c327024f7106",
        "part": "whole"
       },
       "id": "ba30b6f5-86dc-4cc4-829a-a17fcb3d174b"
      }
     }
    },
    "d34e2833-285f-48fa-a922-6c28d6ceb739": {
     "id": "d34e2833-285f-48fa-a922-6c28d6ceb739",
     "prev": "531b7af8-91cf-4ec2-bab9-475c3e122897",
     "regions": {
      "0597c53a-bf52-42b5-b460-05327e6e8f79": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "b9a7934c-ba10-4f66-88d6-f2a0ba9d65c5",
        "part": "whole"
       },
       "id": "0597c53a-bf52-42b5-b460-05327e6e8f79"
      }
     }
    },
    "d4a1f08f-d5b3-4e23-b406-b97d0b73acf8": {
     "id": "d4a1f08f-d5b3-4e23-b406-b97d0b73acf8",
     "prev": "278d1841-c74d-4cc0-a92b-eba4e66b71aa",
     "regions": {
      "5dba8dd1-c671-49c8-92eb-c58213c8807a": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "59c84c0a-4f74-41cd-be98-c327024f7106",
        "part": "whole"
       },
       "id": "5dba8dd1-c671-49c8-92eb-c58213c8807a"
      }
     }
    },
    "d7dc555e-99e9-4811-9f57-010668a41080": {
     "id": "d7dc555e-99e9-4811-9f57-010668a41080",
     "prev": "70af8e65-c113-4b50-a1a5-dce71786e991",
     "regions": {
      "5a30759f-ca57-42c2-a6ae-68a70c93d9b7": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "b7400a16-6c6e-4a20-bad2-062c297a7fcc",
        "part": "whole"
       },
       "id": "5a30759f-ca57-42c2-a6ae-68a70c93d9b7"
      }
     }
    },
    "dac65a00-6fb2-4683-b280-7f6bbb94a480": {
     "id": "dac65a00-6fb2-4683-b280-7f6bbb94a480",
     "prev": "31d6a5a2-39b5-44c2-91c7-8157d50c8826",
     "regions": {
      "06cdd955-975a-4eed-8a1b-019b49e075bb": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "4538f2c9-2757-49b2-b9c1-e8fe3724e573",
        "part": "whole"
       },
       "id": "06cdd955-975a-4eed-8a1b-019b49e075bb"
      }
     }
    },
    "ddba1e1f-516f-4186-9930-8a25ed40f606": {
     "id": "ddba1e1f-516f-4186-9930-8a25ed40f606",
     "prev": "f25b4efe-0671-4152-9a7c-947834ae8be8",
     "regions": {
      "1e08c3c0-4c1e-4ca6-a735-a4a9efb36bd3": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "dfe4d52a-fbf8-4870-9cf5-eebf59e170ca",
        "part": "whole"
       },
       "id": "1e08c3c0-4c1e-4ca6-a735-a4a9efb36bd3"
      }
     }
    },
    "deae24e7-3e39-4e1d-b2f4-f543cf4915e3": {
     "id": "deae24e7-3e39-4e1d-b2f4-f543cf4915e3",
     "prev": "d336642b-b226-42ad-8a4a-ba46ddb6e4e3",
     "regions": {
      "a4449e30-0c95-42e3-b15f-409b0b4f75fe": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "34b457be-6b84-401d-9262-3907f5a74648",
        "part": "whole"
       },
       "id": "a4449e30-0c95-42e3-b15f-409b0b4f75fe"
      }
     }
    },
    "e16d2151-e325-41ef-89e2-7e78b7fb0c16": {
     "id": "e16d2151-e325-41ef-89e2-7e78b7fb0c16",
     "prev": "083acf1f-a943-438e-a9af-bf0dff4064cf",
     "regions": {
      "342894d6-830f-4d64-bff7-8a9e661d038f": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "cf395a94-1178-4443-a96b-0aa8f7832039",
        "part": "whole"
       },
       "id": "342894d6-830f-4d64-bff7-8a9e661d038f"
      }
     }
    },
    "e47b4982-cf11-4b56-846e-a8af9a73efcb": {
     "id": "e47b4982-cf11-4b56-846e-a8af9a73efcb",
     "prev": "0090975e-3c6e-48c0-8351-1340c5f655e0",
     "regions": {
      "ba193d85-9d26-4252-9439-b3b5aa3b5ddd": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "61374f8a-04ae-4c73-a232-12d1957e2ca5",
        "part": "whole"
       },
       "id": "ba193d85-9d26-4252-9439-b3b5aa3b5ddd"
      }
     }
    },
    "e719aa7e-70d7-4867-9b8f-2245670c97ae": {
     "id": "e719aa7e-70d7-4867-9b8f-2245670c97ae",
     "prev": "5a3c8615-e864-48b8-8c49-60b47c6eb8a5",
     "regions": {
      "2383f6fa-49c0-4c37-bc05-a6b2b832cd36": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "d859b934-3460-43d1-99d5-609ae39b0637",
        "part": "whole"
       },
       "id": "2383f6fa-49c0-4c37-bc05-a6b2b832cd36"
      }
     }
    },
    "f25b4efe-0671-4152-9a7c-947834ae8be8": {
     "id": "f25b4efe-0671-4152-9a7c-947834ae8be8",
     "prev": "c3671b07-84a8-414f-9e57-a06be2eb044f",
     "regions": {
      "7efab896-3165-4c29-adfd-9d5a2051ceee": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "29b1820b-a914-4366-b58a-f0f30e3b59be",
        "part": "whole"
       },
       "id": "7efab896-3165-4c29-adfd-9d5a2051ceee"
      }
     }
    },
    "f403c5f2-268c-41fb-8ad6-380e8902fa8f": {
     "id": "f403c5f2-268c-41fb-8ad6-380e8902fa8f",
     "prev": "5063271b-d616-43f0-aecd-484f101a99d0",
     "regions": {
      "2478d442-26eb-49ee-9004-077bb0f66994": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "b7400a16-6c6e-4a20-bad2-062c297a7fcc",
        "part": "whole"
       },
       "id": "2478d442-26eb-49ee-9004-077bb0f66994"
      }
     }
    },
    "f4916937-b47a-4a59-8349-d877f3a588f4": {
     "id": "f4916937-b47a-4a59-8349-d877f3a588f4",
     "prev": "661eb3af-fc8c-4e3f-96b0-fd5c9faf6949",
     "regions": {
      "c6f153ee-8ae7-4288-ac4a-1530b58652c6": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "433705ff-0f81-490e-9ab1-d5ddf099434b",
        "part": "whole"
       },
       "id": "c6f153ee-8ae7-4288-ac4a-1530b58652c6"
      }
     }
    },
    "f499aa32-135c-48d0-8c46-3a2464a4f175": {
     "id": "f499aa32-135c-48d0-8c46-3a2464a4f175",
     "prev": null,
     "regions": {
      "c629e9ab-3555-4675-a20b-9c86f13d7113": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "dfe4d52a-fbf8-4870-9cf5-eebf59e170ca",
        "part": "whole"
       },
       "id": "c629e9ab-3555-4675-a20b-9c86f13d7113"
      }
     }
    },
    "fffffcc6-6c80-4cc2-b67e-5288640703d6": {
     "id": "fffffcc6-6c80-4cc2-b67e-5288640703d6",
     "prev": "ddba1e1f-516f-4186-9930-8a25ed40f606",
     "regions": {
      "dfd8a8a4-2a13-4981-b35b-b3744b4152a9": {
       "attrs": {
        "height": 0.8,
        "width": 0.8,
        "x": 0.1,
        "y": 0.1
       },
       "content": {
        "cell": "e1ff355b-7ac9-493e-9628-f999d0112147",
        "part": "whole"
       },
       "id": "dfd8a8a4-2a13-4981-b35b-b3744b4152a9"
      }
     }
    }
   },
   "themes": {}
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
